home *** CD-ROM | disk | FTP | other *** search
/ HTBasic 9.3 / HTBasic 9.3.iso / 83win / data1.cab / Basic_Plus_Examples / BSQUADLD < prev    next >
Text File  |  2001-03-02  |  9KB  |  244 lines

  1. 10    ! ********************************************************************
  2. 20    ! Example: Bomb Squad (*LOAD Version)
  3. 30    !
  4. 40    ! This program demonstrates the use of the CLOCK widget in TIMER mode
  5. 50    ! by playing a game in which the user has to disarm a bomb by cutting
  6. 60    ! wires. There are 10 wires. You must cut the correct four to disarm
  7. 70    ! the bomb. Of the six wires left, four are don't-cares and two cause
  8. 80    ! the bomb go off immediately.
  9. 90    !
  10. 100   ! The wires are represented by 10 TOGGLEBUTTONs. This program uses the
  11. 110   ! SYSTEM widget to create the TOGGLEBUTTONs. This is convenient, since
  12. 120   ! otherwise you would have to have some degree of separate code for
  13. 130   ! each TOGGLEBUTTON. The fact that you only get one event for all
  14. 140   ! 10 TOGGLEBUTTONs is OK, too, since each time a TOGGLEBUTTON event
  15. 150   ! happens the program scans through all the TOGGLEBUTTONs to check
  16. 160   ! their VALUEs.
  17. 170   !
  18. 180   ! ********************************************************************
  19. 190   !
  20. 200       RANDOMIZE INT(10^7*FRACT(TIMEDATE))! Set random seed
  21. 210   !
  22. 220   ! Miscellaneous general-purpose variables
  23. 230   !
  24. 240       INTEGER N,V
  25. 250       DIM S$[256],B$(1:1)[64],Eol$[2]
  26. 260       Eol$=CHR$(13)
  27. 270   !
  28. 280   ! Variables for playing the game
  29. 290   !
  30. 300       INTEGER Playgame        ! Indicates game in progress
  31. 310       INTEGER Wires(1:10)     ! Designates wire settings
  32. 320       INTEGER Live,Kill,Dontcare,Cut! Wire values
  33. 330       DATA 1,2,3,4
  34. 340       READ Live,Deadly,Dontcare,Cut
  35. 350       INTEGER Livewires,Lethal! Number of live/deadly wires
  36. 360   !
  37. 370       CLEAR SCREEN
  38. 380   !
  39. 390   ! Create a SYSTEM widget and load Screen Builder file
  40. 400   !
  41. 410       COM @Sys
  42. 420       ASSIGN @Sys TO WIDGET "SYSTEM"
  43. 430       CONTROL @Sys;SET ("*LOAD":"HELP_EX/BSQUAD.SCR")
  44. 440   !
  45. 450   ! Set up events for SYSTEM MENU, TOGGLEBUTTONS, and CLOCK
  46. 460   !
  47. 470       ON EVENT @Sys,"SYSTEM MENU",15 GOTO Finis
  48. 480       ON EVENT @Sys,"CHANGED" GOSUB Cutwire
  49. 490       ON EVENT @Sys,"TIMER" GOSUB Boomboom
  50. 500   !
  51. 510   ! Turn on panel
  52. 520   !
  53. 530       CONTROL @Sys;SET ("*NAME":"Main","VISIBLE":1)
  54. 540   !
  55. 550   ! Display instructions using a DIALOG
  56. 560   !
  57. 570       S$="Disarm the bomb before the clock times out"&Eol$
  58. 580       S$=S$&Eol$
  59. 590       S$=S$&"The bomb has ten wires:"&Eol$
  60. 600       S$=S$&Eol$
  61. 610       S$=S$&"  - 4 are inert."&Eol$
  62. 620       S$=S$&"  - 4 must be cut to disarm the bomb."&Eol$
  63. 630       S$=S$&"  - 2 are triggers: cut both, "&Eol$
  64. 640       S$=S$&"      and the bomb goes off."&Eol$
  65. 650       S$=S$&Eol$
  66. 660       S$=S$&"GOOD LUCK!"&Eol$
  67. 670   !
  68. 680       B$(1)="Click Here To Begin Game"
  69. 690   !
  70. 700       DIALOG "INFORMATION",S$;SET ("TITLE":" Bomb Squad Instructions","BACKGROUND":9,"PEN":0,"JUSTIFICATION":"LEFT","DIALOG BUTTONS":B$(*))
  71. 710   !
  72. 720   ! Main game loop.
  73. 730   !
  74. 740       LOOP
  75. 750   !
  76. 760   ! Clear PRINTER widget, set up all the "wires".
  77. 770   !
  78. 780           DISABLE
  79. 790           CONTROL @Sys;SET ("*NAME":"Main/Printer","TEXT":"")
  80. 800           CALL Pr("Welcome to BOMB SQUAD.")
  81. 810           CALL Pr("")
  82. 820   !
  83. 830           FOR N=1 TO 10
  84. 840               Wires(N)=Dontcare
  85. 850               S$=VAL$(N)
  86. 860               CONTROL @Sys;SET ("*NAME":"Main/T"&S$)
  87. 870               CONTROL @Sys;SET ("SENSITIVE":1,"VALUE":0)
  88. 880           NEXT N
  89. 890   !
  90. 900   ! Set the deadly wires.
  91. 910   !
  92. 920           Lethal=0
  93. 930           REPEAT
  94. 940               N=1+INT(10*RND)
  95. 950               IF Wires(N)=Dontcare THEN
  96. 960                   Wires(N)=Deadly
  97. 970                   Lethal=Lethal+1
  98. 980               END IF
  99. 990           UNTIL (Lethal=2)
  100. 1000  !
  101. 1010  ! Set up the live wires.
  102. 1020  !
  103. 1030           Livewires=0
  104. 1040           REPEAT
  105. 1050               N=1+INT(10*RND)
  106. 1060               IF Wires(N)=Dontcare THEN
  107. 1070                   Wires(N)=Live
  108. 1080                   Livewires=Livewires+1
  109. 1090               END IF
  110. 1100           UNTIL (Livewires=4)
  111. 1110  !
  112. 1120  ! Set the timer to 30 seconds, start it running.
  113. 1130  !
  114. 1140           CONTROL @Sys;SET ("*NAME":"Main/Clock")
  115. 1150           CONTROL @Sys;SET ("TIMER VALUE":30000,"TIMER STATE":"RUNNING")
  116. 1160  !
  117. 1170  ! Loop until game over. Note how the "Playgame" variable is
  118. 1180  ! set to 1 by EVENT-driven routines to tell the main routine that
  119. 1190  ! the game is over and that a new one should be started (by
  120. 1200  ! returning to the top of the loop).
  121. 1210  !
  122. 1220           ENABLE
  123. 1230           Playgame=0
  124. 1240           REPEAT
  125. 1250           UNTIL (Playgame=1)
  126. 1260  !
  127. 1270       END LOOP
  128. 1280       STOP
  129. 1290  !
  130. 1300  ! This routine checks the status of the "wire" togglebuttons.
  131. 1310  ! It relies on the "Wires" array to track the condition of
  132. 1320  ! the wire set at any time.
  133. 1330  !
  134. 1340  Cutwire:!
  135. 1350  !
  136. 1360  ! Check status of all ten wires.
  137. 1370  !
  138. 1380       FOR N=1 TO 10
  139. 1390  !
  140. 1400  ! Ignore the wire if it has been cut.
  141. 1410  !
  142. 1420           IF Wires(N)<>Cut THEN
  143. 1430  !
  144. 1440  ! Otherwise, query the togglebutton value.
  145. 1450  !
  146. 1460               S$=VAL$(N)
  147. 1470               CONTROL @Sys;SET ("*NAME":"Main/T"&S$)
  148. 1480               STATUS @Sys;RETURN ("VALUE":V)
  149. 1490  !
  150. 1500  ! Ignore the button if it is not set, otherwise ...
  151. 1510  !
  152. 1520               IF V=1 THEN
  153. 1530  !
  154. 1540  ! ... disable the button ...
  155. 1550  !
  156. 1560                   CONTROL @Sys;SET ("SENSITIVE":0)
  157. 1570  !
  158. 1580  ! ... and take the appropriate measures for the wire value.
  159. 1590  !
  160. 1600                   SELECT Wires(N)
  161. 1610  !
  162. 1620  ! Don't care, just say so.
  163. 1630  !
  164. 1640                   CASE Dontcare
  165. 1650                       CALL Pr("Inert wire.")
  166. 1660  !
  167. 1670  ! Live wire: decrement the live-wire count -- if it reaches 0,
  168. 1680  ! you win. Use a DIALOG to indicate the matter and query to see
  169. 1690  ! if the user wants to play another game.  If it is not 0,
  170. 1700  ! announce the wire has been cut and list the number of wires
  171. 1710  ! remaining.
  172. 1720  !
  173. 1730                   CASE Live
  174. 1740                       Livewires=Livewires-1
  175. 1750                       IF Livewires=0 THEN
  176. 1760                           CONTROL @Sys;SET ("*NAME":"Main/Clock")
  177. 1770                           CONTROL @Sys;SET ("TIMER STATE":"STOPPED")
  178. 1780                           S$="Play another game?"
  179. 1790                           DIALOG "QUESTION",S$,Btn;SET ("TITLE":" Bomb Disarmed !! ")
  180. 1800                           SELECT Btn
  181. 1810                           CASE 0
  182. 1820                               Playgame=1! Start new game.
  183. 1830                               RETURN
  184. 1840                           CASE 1
  185. 1850                               GOTO Finis! End the program.
  186. 1860                           END SELECT
  187. 1870                       ELSE
  188. 1880                           S$=VAL$(Livewires)
  189. 1890                           CALL Pr("LIVE WIRE -- "&S$&" wires left.")
  190. 1900                       END IF
  191. 1910  !
  192. 1920  ! Is deadly -- count down deadly wires, if zero, you are dead.
  193. 1930  !
  194. 1940                   CASE Deadly
  195. 1950                       Lethal=Lethal-1
  196. 1960                       IF Lethal=0 THEN
  197. 1970                           GOSUB Boomboom
  198. 1980                           RETURN
  199. 1990                       ELSE
  200. 2000                           CALL Pr("DANGER -- trigger wire, one left!")
  201. 2010                       END IF
  202. 2020                   END SELECT
  203. 2030  !
  204. 2040  ! If you have not won or been killed, mark this wire as
  205. 2050  ! being "cut".
  206. 2060  !
  207. 2070                   Wires(N)=Cut
  208. 2080  !
  209. 2090               END IF
  210. 2100           END IF
  211. 2110       NEXT N
  212. 2120       RETURN
  213. 2130  !
  214. 2140  ! This routine tells you that the bomb exploded and you are dead
  215. 2150  !
  216. 2160  Boomboom:!
  217. 2170       CONTROL @Sys;SET ("*NAME":"Main/Clock","TIMER STATE":"STOPPED")
  218. 2180       S$="YOU'RE DEAD!"
  219. 2190       S$=S$&Eol$&Eol$
  220. 2200       S$=S$&"Play another game?"
  221. 2210       DIALOG "QUESTION",S$,Btn;SET ("TITLE":" Bomb Exploded !! ")
  222. 2220       IF Btn=0 THEN
  223. 2230           Playgame=1
  224. 2240           RETURN
  225. 2250       ELSE
  226. 2260           GOTO Finis
  227. 2270       END IF
  228. 2280       RETURN
  229. 2290  !
  230. 2300  ! Go here when done.
  231. 2310  !
  232. 2320  Finis:!
  233. 2330       ASSIGN @Sys TO *! Delete SYSTEM widget
  234. 2340       END
  235. 2350  !
  236. 2360  ! ***************** End of Main Program ***********************
  237. 2370  !
  238. 2380  ! Routine to print string in PRINTER widget.
  239. 2390  !
  240. 2400       SUB Pr(S$)
  241. 2410           COM @Sys
  242. 2420           CONTROL @Sys;SET ("*NAME":"Main/Printer","APPEND TEXT":S$)
  243. 2430       SUBEND
  244.